﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections;

namespace GIFT
{
    class ConsultaComando
    {

        public ConsultaComando()
        {
            consulta = new Consulta();
        }

        /***************************** Consultas para datos basicos de comandos ***********************/

        //Obtiene de la base de datos todos los comandos existentes, y los retorna en un arreglo
        public ArrayList obtieneComandos()
        {
            ArrayList comandos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[comando]";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    comandos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return comandos;
        }

        //BUsca en la base de datos todos los atributos basicos de un comando
        public ArrayList obtenerAtributosBasicos(String nombreComando)
        {
            ArrayList atributos = new ArrayList();
            String sentenciaSql = "SELECT [id],[nombre],[descripcion],[fecha actualizacion],[tipo],[id formulario] FROM [GIFT].[dbo].[comando] WHERE [nombre] = '"+ nombreComando +"'";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    atributos.Add(datos.GetValue(0).ToString());
                    atributos.Add(datos.GetValue(1).ToString());
                    atributos.Add(datos.GetValue(2).ToString());
                    atributos.Add(datos.GetValue(3).ToString());
                    atributos.Add(datos.GetValue(4).ToString());
                    atributos.Add(datos.GetValue(5).ToString());
                }
            }
            consulta.CierraConexion();
            return atributos;
        }

        //Busca en la base de datos el atributo del comando con el nombre que recibe como parametro
        public String buscarAtributoBasicoComando(String nombre, String atributo)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select [" + atributo + "] from [GIFT].[dbo].[comando] Where nombre='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                    if (atr == "NULL")
                    {
                        atr = "";
                    }
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Recibe un nombre y retorna true si este ya existe en la base de datos
        public bool existeComando(String nombre)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[comando]  Where nombre ='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }

        //Busca nombres de los comandos que contengan la hilera que reciba como parametro en el nombre o la descripcion
        public ArrayList buscarConcordanciasComando(String frase)
        {
            ArrayList campos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select C.nombre From [GIFT].[dbo].[comando] C Where C.nombre LIKE '%" + frase + "%' OR C.descripcion LIKE '%" + frase + "%'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    campos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return campos;
        }

        //Borrar un comando
        public void borrarComando(String nombre)
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[comando] WHERE nombre ='" + nombre + "'";//crea la consulta
            consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        //Guarda en la base de datos un nuevo comando, recibe los valores a introducir 
        public void crearComando(String nombre, String descripcion, String tipo, String idFormulario)
        {
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[comando]([nombre],[descripcion],[fecha actualizacion],[tipo],[id formulario])VALUES('" + nombre+ "','"+ descripcion +"',(GetDate()), '"+ tipo +"'," + idFormulario +")";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica un comando en la base de datos
        public void modificarComando(String nombre, String descripcion, String tipo, String idFormulario)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[comando]SET [descripcion] = '"+ descripcion +"',[fecha actualizacion] = (GetDate()),[tipo] = '"+ tipo +"',[id formulario] = "+ idFormulario +"WHERE [nombre] = '"+ nombre +"'";
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica un atributo de un comando en la base de datos, si el valor es una hilera debe de venir como "'hilera'"
        public void actualizarAtributoComando(String nombre, String atributo, String valorAtributo)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[comando] SET ["+ atributo +"] = " + valorAtributo + ",[fecha actualizacion] = (GetDate()) WHERE [nombre] = '" + nombre + "'";
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }


        /***************************** Consultas para datos de comandos con mascara ***********************/

        //Obtiene de la base de datos todas las mascaras que pertenencen a un comando, y los retorna en un arreglo
        public ArrayList obtieneMascarasDeComando(String nombreComando)
        {
            ArrayList mascaras = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            String idComando = buscarAtributoBasicoComando(nombreComando, "id");
            sentenciaSql = "SELECT [nombre] FROM [GIFT].[dbo].[mascara] WHERE [id comando] = "+ idComando;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    mascaras.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return mascaras;
        }

        //Crea una mascara
        public String crearMascara(String idTipoCampoReferencia, String valorPrevio, String valorPosterior, String idComando, String idTipoCampoModificado, String nombreMascara)
        {
            String resultado = "ERROR";
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[mascara]([id tipo campo referencia],[valor previo],[valor posterior],[id comando],[id tipo campo modificado],[nombre]) VALUES(" + idTipoCampoReferencia + ",'" + valorPrevio + "','" + valorPosterior + "'," + idComando + "," + idTipoCampoModificado + ",'" + nombreMascara+ "')";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    resultado = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return resultado;
        }

        //Borrar una mascara
        public void borrarMascara(String idMascara)
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[mascara] WHERE [id] = "+ idMascara; //crea la consulta
            consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        //Busca en la base de datos todos los atributos de la mascara
        public ArrayList obtenerAtributosMascara(String nombreMascara)
        {
            ArrayList atributos = new ArrayList();
            String sentenciaSql = "SELECT [id],[id tipo campo referencia],[valor previo],[valor posterior],[id comando],[id tipo campo modificado],[nombre] FROM [GIFT].[dbo].[mascara] WHERE [nombre] = '" + nombreMascara + "'";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    atributos.Add(datos.GetValue(0).ToString());//id
                    atributos.Add(datos.GetValue(1).ToString());//id  tipo campo referencia
                    atributos.Add(datos.GetValue(2).ToString());//valor previo
                    atributos.Add(datos.GetValue(3).ToString());//valor posterior
                    atributos.Add(datos.GetValue(4).ToString());//id comando 
                    atributos.Add(datos.GetValue(5).ToString());//id tipo campo modificado
                    atributos.Add(datos.GetValue(6).ToString());//nombre
                }
            }
            consulta.CierraConexion();
            return atributos;
        }

        //Busca en la base de datos el atributo de la mascara con el id que recibe como parametro
        public String buscarAtributoMascara(String nombreMascara, String atributo)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select [" + atributo + "] from [GIFT].[dbo].[mascara] Where nombre= '" + nombreMascara + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                    if (atr == "NULL")
                    {
                        atr = "";
                    }
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Modifica una mascara en la base de datos
        public void modificarMascara(String idMascara, String idTipoCampoReferencia, String valorPrevio, String valorPosterior, String idComando, String idTipoCampoModificado, String nombreMascara)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[mascara] SET [id tipo campo referencia] = " + idTipoCampoReferencia + ",[valor previo] = '" + valorPrevio + "', [valor posterior] = '" + valorPosterior + "',[id comando] = " + idComando + ", [id tipo campo modificado] = " + idTipoCampoModificado + ", [nombre] = '" + nombreMascara+ "' WHERE id = " + idMascara;
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica un atributo de una mascara en la base de datos, si el valor es una hilera debe de venir como "'hilera'"
        public void actualizarAtributoMascara(String idMascara, String atributo, String valorAtributo)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[mascara] SET [" + atributo + "] = " + valorAtributo + ",[fecha actualizacion] = (GetDate()) WHERE [id] = " + idMascara;
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Recibe un id y retorna true si este ya existe en la base de datos
        public bool existeMascaraId(String idMascara)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[mascara]  Where id ='" + idMascara + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }

        //Recibe un nombre y retorna true si este ya existe en la base de datos
        public bool existeMascaraNombre(String nombreMascara)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[mascara]  Where nombre ='" + nombreMascara + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }


        /***************************** Consultas para datos de comandos sin mascara ***********************/

        //Crea un comando sin mascara
        public void crearComandoSinMascara(String idComandoSM, String nivelDerechos)
        {
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[comando sin mascara] ([id] ,[nivel derechos]) VALUES ("+ idComandoSM +" ,'"+ nivelDerechos + "')";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Borrar comando sin mascara
        public void borrarComandoSinMascara(String idComando)
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[comando sin mascara] WHERE [id] = " + idComando; //crea la consulta
            consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        //Busca en la base de datos todos los atributos del comando sin mascara
        public ArrayList obtenerAtributosComandoSinMascara(String idComando)
        {
            ArrayList atributos = new ArrayList();
            String sentenciaSql = "SELECT [id],[nivel derechos]FROM [GIFT].[dbo].[comando sin mascara] WHERE [id] = " + idComando;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    atributos.Add(datos.GetValue(0).ToString());
                    atributos.Add(datos.GetValue(1).ToString());
                }
            }
            consulta.CierraConexion();
            return atributos;
        }

        //Modifica un comando sin mascara en la base de datos
        public void modificarComandoSinMascara(String idComandoActual,String idComandoNuevo , String nivelDerechos)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[comando sin mascara] SET [id] = "+ idComandoNuevo +",[nivel derechos] = '"+ nivelDerechos +"' WHERE [id] = " + idComandoActual;
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        /***************************** Consultas para datos de comandos busqueda ***********************/

        //Obtiene de la base de datos todas los filtros que pertenencen a un comando, y los retorna en un arreglo
        public ArrayList obtieneFiltrosDeComando(String nombreComando)
        {
            ArrayList filtros = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            String idComando = buscarAtributoBasicoComando(nombreComando, "id");
            sentenciaSql = "SELECT [id] FROM [GIFT].[dbo].[comando busqueda] WHERE [id comando] = " + idComando;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    filtros.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return filtros;
        }

        //Crea un filtro de busqueda y retorna su id
        public String crearFiltroBusqueda(String idComando, String idTipoCampo)
        {
            String resultado = "ERROR";
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[comando busqueda] ([id comando] ,[id tipo campo]) VALUES( "+ idComando +", "+ idTipoCampo +")";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    resultado = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return resultado;
        }

        //Borrar una mascara
        public void borrarFiltroBusqueda(String idFiltro)
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[comando busqueda] WHERE [id] = " + idFiltro; //crea la consulta
            consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        //Busca en la base de datos todos los atributos del filtro de busqueda
        public ArrayList obtenerAtributosFiltroBusqueda(String idComando)
        {
            ArrayList atributos = new ArrayList();
            String sentenciaSql = "SELECT [id] ,[id comando] ,[id tipo campo] FROM [GIFT].[dbo].[comando busqueda] WHERE [id] = " + idComando;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    atributos.Add(datos.GetValue(0).ToString());//id
                    atributos.Add(datos.GetValue(1).ToString());//id comando
                    atributos.Add(datos.GetValue(2).ToString());//id tipo campo
                }
            }
            consulta.CierraConexion();
            return atributos;
        }

        //Busca en la base de datos el atributo del filtro de busqueda con el id que recibe como parametro
        public String buscarAtributoFiltroBusqueda(String idComando, String atributo)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select [" + atributo + "] from [GIFT].[dbo].[comando busqueda] Where id= " + idComando;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                    if (atr == "NULL")
                    {
                        atr = "";
                    }
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Modifica un filtro en la base de datos
        public void modificarFiltroDeBusqueda(String idComandoBusqueda, String idTipoCampo, String idComando)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[comando busqueda] SET [id comando] = "+ idComando +",[id tipo campo] = "+ idTipoCampo +" WHERE [id] = "+ idComandoBusqueda;
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica un atributo de un filtro en la base de datos, si el valor es una hilera debe de venir como "'hilera'"
        public void actualizarAtributoFiltroBusqueda(String idComando, String atributo, String valorAtributo)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[comando busqueda] SET [" + atributo + "] = " + valorAtributo + ",[fecha actualizacion] = (GetDate()) WHERE [id] = " + idComando;
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Recibe un id de filtro y retorna true si este ya existe en la base de datos
        public bool existeFiltro(String idFiltro)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select id From [GIFT].[dbo].[comando busqueda]  Where id = " + idFiltro;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }



        //Atributos de la clase
        private Consulta consulta;

    }//Fin de la clase
}
